


"""
变成的思想
面向过程：
按照步骤解决问题，思路是简单的
想更改，所有的流程都需要重新来

面向对象：

把十五看成对象，每一个对象有属性和方法也就是特征与技能
易于扩展，可以修改其中的一条对象并且不影响其他的
适合大的项目  设计是比较复杂的

"""

"""
类：描述一类事物的共同特征和行为

"""

# 类的命名规范

# class Teacher:
#     pass    # 定义了一个空的类

# 对象
# 是根据类创建出来的具体的个体，这个过程叫做实例化

# t1 = Teacher()   # 类的实例化
# print(t1)


# 类是有属性的以及他的方法

# 定义在类中、方法外的变量
# 所有的对象共享一个值


# class Teacher:
#     school = '旭辉中心'   #   类属性
# print(Teacher.school)
# t = Teacher()
# print(t.school)


# 实例化我们的类属性

# 通过 __init__方法来定义，每个对象都独有的
# __init__：是一个初始化的方法，创建类的时候自动调用

# class Teacher:
#     def __init__(self,name,age):
#         self.name = name    # 实例化属性
#         self.age = age      # 实例化属性
#         # self 代表着调用该方法中的对象自己
#         # 对象调用的时候，自动传入自己，作为self
#



# class Teacher:    # 饼干的摸具
#     def course(self):   # 做出来什么样子的饼干
#         print(f"我在上课。我是{self}")

# t = Teacher()
# t.course()   # 等价于Teacher 中的 course

#

"""
类：就是一个饼干的模具
对象：就是模具做出来的具体的饼干样子
"""
#
# class Teacher:
#     school = '旭辉中心'
#     subject = 'python'
# t = Teacher()
# del Teacher.subject
# print(t.subject)
# print(t.school)


# 查看类的属性

# print(Teacher.__dict__)  #   {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Teacher' objects>, '__weakref__': <attribute '__weakref__' of 'Teacher' objects>, '__doc__': None}

# 读取类的属性

# print(Teacher.school)   # 属性是什么

# 修改类属性
# t1 = Teacher.school = '师范'
# print(t1)


# 添加类属性
# t.subject = 'python'
# print(t.subject)

# 删除类属性

# del t.subject




# class Teacher:
#     # school = '旭辉'
#     school = '北大'
#
# t = Teacher()  # t = 类  进行一个实例化，将类的属性更改为对象的属性
# t.school = '北大'   # 增加的是一个是实例化的属性，并不是一个类的属性， 此时修改的是一个对象的属性，并不是一个类的属性
# del Teacher.school  # 删除了实例化的属性，但是类的属性还是存在的    此时删除的是一个   类的属性，但是 对象的属性还是存在的 所以输出的是北大
# del t.school       # 这个时候，删除的是 对象的属性，暴漏了原来类的属性 所以输出的是旭辉
# print(t.school)    # 输出北大是对的
# print(Teacher.school)   #  类的属性已经不存在了，所以会报错   AttributeError


#
# class Teacher:  # 创建了一个类
#      school = '旭辉'   # 这个是类的属性
# t = Teacher()   #实例化了一个对象，创建了一个对象  t
# t.school = '北大'   # 给对象 t  添加了一个实例属性 school
# del Teacher.school  # 删除的是 类的  school
# # del t.school        # 删除的是对象  t   的实例属性  school
# print(Teacher.school)    #   属性错误：类型对象 'Teacher' 没有 'school' 属性
# # print(t.school)

# t = Teacher()     Teacher   指的是群体     t = Teacher  我将这个老师  给实例化了，   王老师
# # ()   是创建了一个对象    我在老师的这个群体里 创建一个姓 王的老师
#
# 删除的时候， 应该删除姓王的老师   但是产出完王老师之后，还有其他的老师，只不过这个老师还是一个群体，






# class Teacher:
#
#     xxxx  = '类的属性'
#
# t = Teacher()  #  实例化了一个对象
# print(t.xxx)   # 输出的是类的属性
#
# t.xxxx = '对象的属性'
# print(t.xxxx)   # 对象的属性，（优先用自己的）
#
# del t.xxxx
# print(t.xxxx)   # 又变回了类的属性




# 类的属性是可以被所有的对象所共享的


# class Teacher:
#     pass
#
# Teacher.count =100  # 类的属性
#
#
# t1 = Teacher()   # 创建为对象的属性
# t2 = Teacher()   # 创建为对象的属性
#
# t1.count = 999   # 修改 t1 对象的属性为  999   相当于是添加了属于自己的属性
# print(t1.count)  # 调用对象的属性
# print(t2.count)  # 调用对象的属性
# print(Teacher.count)   # 调用的是类调用自己的属性




# class A:   # 定义了一个类 叫做A
#     def f(self,n):   # 定义了一个方法叫做f
#         """
#         self: 自动接收调用方法的独享本身
#         n: 是自己传入的参数
#         self  必须是排在第一的
#         :param n:
#         :return:
#         """
#         print(self,n)
#
# a = A() # 创建了一个示例 a
# a.f(1)  # 通过对象进行调用。是一个简洁的写法
# """
# python自动的将a 作为了 self的参数传入，等价于 A.f(a,1)
# """
# A.f(a,1)   # 通过A类调用 f 的方法
# """
# 是底层的等价的方法，必须手动的传入两个参数
# 第一个是传给 self
# 第二个传给 n  的





# classmethod 方法（类的方法）
# 自动的传递cls的本身
# 用classmethod 进行装饰
# class B:   # 创建了一个类叫做  B
#     @classmethod
#     def f(cls,n):   # 创建一个f方法 类的第一个方法是 cls 它会自动化的接收当前函数的本身（B） n是调用者自己传递的
#         print(cls,n)
# B.f(1)   #  自动的传入B
# b = B
# b.f(1)   # 也是可以的，但是传入的也是 B

# 静态方法：在静态方法里面是没有self的，它不自动的传入对象或者类
# 不自动传任何的东西，就是一个普通的函数
# 用  @staticmethod  来装饰

# class C:
#      @staticmethod
#      def f(n):   #  f 就相当于是一个 普通的函数
#          print(n)   # 只能访问传入的参数，也就是这里的 n  访问不了类的属性
# C.f(10)  # 直接用类C 调用这个静态的方法 f  传入10，不需要创建对象的
# c = C()     # 创建了一个C的示例
# c.f(20)  # 用实例来调用方法





class Teacher:
    school = "图灵学院"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def course(self):
        print(f"{self.name} 在 {self.school} 上课")

    @classmethod
    def change_school(cls, new_name):
        cls.school = new_name

    @staticmethod
    def info():
        print("这是教师类")


t1 = Teacher("龙仔", 18)
t2 = Teacher("西施", 18)

t1.course()

Teacher.change_school("清华")
t2.course()

t1.hobby = "篮球"
print(t1.__dict__)

del t1.hobby

print(Teacher.__dict__)